/**
 * 商品模块
 */
const fs = require('fs');
const { getUniqueId } = require('../utils/time');
const { isRequire } = require('../utils/common');
const { paginateArray, PAGE_SIZE } = require('../utils/page');

// 商品对象
const productTemplate = {
    id: '', 
    productName: '', // 商品名
    productDetail: '', // 商品描述
    productPrice: '', // 商品价格
    productImage: '', // 商品图片
    productType: '', // 商品类型
    productNum: '', // 商品数量
    zan: '', // 商品点赞数
    comment: '', // 商品评论数
    createTime: '', // 商品创建时间
    updateTime: '', // 商品更新时间
}

// 商品数据文件地址
const filePath = './data/product.txt';

// 商品对象必填字段
const requireKeys = {
    "productName": "商品名称",  
    "productDetail": "商品描述", 
    "productPrice": "商品价格", 
    "productImage": "商品图片",
    "productType": "商品类型", 
    "productNum": "商品数量",
    "createTime": "商品创建时间",
    "updateTime": "商品更新时间",
}

/**
 * 查询所有商品并返回
 * @returns 
 */
async function readProduct() {
    try {
        const res = await fs.readFileSync(filePath, 'utf-8');
        const data = res.toString();
        // 判断是否有数据
        if (data) {
            const arr = JSON.parse(data);
            return Promise.resolve(arr);
        } else {
            return Promise.resolve([]);
        }
    } catch (error) {
        // 判断是否文件不存在
        if (String(error).indexOf('no such file or directory') !== -1) {
            return Promise.resolve([]);
        }
        return Promise.reject(error);
    }
}

/**
 * 添加商品
 * @param {*} content 商品信息
 * @returns 
 */
async function addProduct(content) {
    try {
        const res = await readProduct();
        // 判断商品名称是否重复
        const index = res.findIndex((item) => item.productName === content.productName);
        if (index > -1) {
            return Promise.reject('该商品名称已存在');
        }
        const uniqueId = getUniqueId();
        content.id = uniqueId;
        // 当前时间戳
        const timestamp = Math.floor(Date.now() / 1000);
        content.createTime = timestamp;
        content.updateTime = timestamp;
        // 遍历判断是否必填
        let flag = isRequire(requireKeys, content);
        if(!flag){
            return Promise.reject('必填项不完整');
        }
        if (res && Array.isArray(res)) {
            res.unshift(content);
        }
        const data = JSON.stringify(res)
        await fs.writeFileSync(filePath, data);
        return Promise.resolve();
    } catch (error) {
        console.log(error);
        return Promise.reject();
    }
}

/**
 * 删除商品
 * @param {*} id 商品id
 * @returns 
 */
async function deleteProduct(query) {
    try {
        const res = await readProduct();
        const index = res.findIndex((item) => query.id === item.id);
        res.splice(index, 1);
        const data = JSON.stringify(res)
        await fs.writeFileSync(filePath, data);
        return Promise.resolve();
    } catch (error) {
        return Promise.reject();
    }
}

/**
 * 编辑产品
 * @param {*} content 产品信息
 * @returns 
 */
async function updateProduct(content) {
    try {
        const res = await readProduct();
        console.log(-1);
        // 遍历判断是否必填
        let flag = isRequire(requireKeys, content);
        if(!flag){
            return Promise.reject('必填项不完整');
        }
        const id = content.id;
        let index = -1;
        if (res && Array.isArray(res)) {
           index = res.findIndex((item) => item.id === id);
        }
        if(index < 0){
            throw new Error();
        }
        const data = JSON.parse(JSON.stringify(res));
        // 当前时间戳
        const timestamp = Math.floor(Date.now() / 1000);
        content.updateTime = timestamp;
        // 修改产品信息
        data.splice(index, 1);
        data.unshift(content);
        const rs = await fs.writeFileSync(filePath, JSON.stringify(data));
        console.log(rs);
        return Promise.resolve();
    } catch (error) {
        console.log(error);
        return Promise.reject();
    }
}

/**
 * 分页查询商品
 * @returns 
 */
async function queryProduct(params) {
    const { pageNum, pageSize, searchParams, type } = params;
    try {
        const res = await fs.readFileSync(filePath, 'utf-8');
        const data = res.toString();
        // 判断是否有数据
        if (data) {
            let arr = JSON.parse(data);
            if(!type){
                const pageResult = paginateArray(arr, pageNum, pageSize ? pageSize : PAGE_SIZE, searchParams )
                return Promise.resolve(pageResult);
            }
            const { productType } = type;
            // 根据商品类型筛选
            if (productType) {
                arr = arr.filter((item) => item.productType === productType);
            }
            const pageResult = paginateArray(arr, pageNum, pageSize ? pageSize : PAGE_SIZE, searchParams )
            return Promise.resolve(pageResult);
            
        } else {
            return Promise.resolve([]);
        }
    } catch (error) {
        // 判断是否文件不存在
        if (String(error).indexOf('no such file or directory') !== -1) {
            return Promise.resolve([]);
        }
        return Promise.reject(error);
    }
}

/**
 * 获取详情
 * @param {*} id 
 */
async function getProductDetail(id) {
    try {
        const res = await readProduct();
        const data = JSON.parse(JSON.stringify(res));
        const item = data.find((item) => id === item.id);
        return Promise.resolve(item);
    } catch (error) {
        console.log(error);
        return Promise.reject();
    }
}

module.exports = { 
    productTemplate, 
    readProduct,
    addProduct ,
    deleteProduct,
    updateProduct,
    queryProduct,
    getProductDetail
}
